#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../parser/parser.h"
#include "../lexer/c_lexer.h"

// 引入eval_code.h头文件
#include "eval_code.h"

// 读取文件内容的函数
char* read_file(const char* filename) {
    FILE* file = fopen(filename, "r");
    if (!file) {
        printf("无法打开文件: %s\n", filename);
        return NULL;
    }
    
    // 获取文件大小
    fseek(file, 0, SEEK_END);
    long file_size = ftell(file);
    fseek(file, 0, SEEK_SET);
    
    // 分配内存并读取文件内容
    char* buffer = (char*)malloc(file_size + 1);
    if (!buffer) {
        printf("内存分配失败\n");
        fclose(file);
        return NULL;
    }
    
    size_t read_size = fread(buffer, 1, file_size, file);
    buffer[read_size] = '\0'; // 确保字符串以null结尾
    
    fclose(file);
    return buffer;
}

int main(int argc, char* argv[]) {
    // 检查命令行参数
    if (argc < 2) {
        printf("usage: %s <filename>\n", argv[0]);
        return 1;
    }
    
    // 读取文件内容
    char* code = read_file(argv[1]);
    if (!code) {
        return 1;
    }
    
   // printf("read file success, file content:\n%s\n", code);
    printf("start to excute code...\n");
    
    // 复制代码内容，因为get_eval_result会释放传入的代码字符串
    char* code_copy = strdup(code);
    if (!code_copy) {
        printf("failed to allocate memory\n");
        free(code);
        return 1;
    }
    init_lexer(code_copy);
    init_parser();
  
    parse_program();
    // 调用get_eval_result函数
    char* result = get_eval_result(code_copy);
    
    // 检查结果
    if (result) {
        printf("excute result:\n %s \n", result);
        // 注意：不要在这里释放result，因为它是由get_eval_result分配的，
        // 应该由调用者（即本程序）负责释放
        free(result);
    } else {
        printf("failed to excute\n");
    }
    
    // 释放原始代码内存
    free(code);
    
    return 0;
} 